// Dictionary.hpp文件
#pragma once
#include <iostream>
#include <unordered_map>
#include <string>
#include <fstream>
#include "MyLog.hpp"

using namespace MyLog;
std::string dictionary_path = "./Dictionary.txt";
std::string sep = ": "; // 把分隔符设置一下

class Dictionary
{
public:
    Dictionary(const std::string &path = dictionary_path)
        : _path(path)
    {
    }

    bool Load() // 加载单词
    {
        std::ifstream in(_path);
        if (!in.is_open())
        {
            LOG(LogLevel::DEBUG) << "打开字典" << _path << "失败";
            return false;
        }
        std::string line;
        while (std::getline(in, line)) // 从in文件流中读到line里去
        {
            auto pos = line.find(sep);    // 找分隔符
            if (pos == std::string::npos) // 没找到, 格式错误
            {
                LOG(LogLevel::WARNING) << "解析" << line << "失败";
                continue; // 解析下一个
            }
            std::string English = line.substr(0, pos); // 左闭右开区间
            // pos位置为分隔符位置，要跳过分隔符，就是pos加上分隔符的大小
            std::string Chinese = line.substr(pos + sep.size());
            if (English.empty() || Chinese.empty())
            {
                LOG(LogLevel::WARNING) << "缺失有效内容：" << line;
                continue; // 解析下一个
            }
            _dict.insert(std::make_pair(English, Chinese));
            LOG(LogLevel::DEBUG) << "加载 " << line;
        }
        return true;
    }

    std::string Translate(const std::string &e, InetAddr &addr)
    {
        // 获得客户端信息
        LOG(LogLevel::DEBUG) << "[" << addr.Ip() << ":" << addr.Port() << "]进入翻译模块";
        auto c = _dict.find(e);
        if (c == _dict.end()) // 没找到
        {
            return "None";
        }
        return c->second; // 找到返回中文
    }

    ~Dictionary() {}

private:
    std::string _path;
    std::unordered_map<std::string, std::string> _dict; // 用哈希表映射
};
